import axios from 'axios'
import { useUserStore } from '../store'
import router from '../router'

// 创建axios实例
const api = axios.create({
  baseURL: 'http://localhost:8080',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
api.interceptors.request.use(
  config => {
    console.log('API请求:', config.method?.toUpperCase(), config.url, config.params || config.data)
    console.log('完整请求URL:', config.baseURL + config.url)
    console.log('请求头:', config.headers)

    // 对非公开API路径添加token和用户信息
    const publicApis = ['/api/auth/login', '/api/auth/register', '/api/auth/refresh-token', '/api/categories', '/api/products', '/api/products/hot']
    const isPublicApi = publicApis.some(path => config.url?.includes(path))

    if (!isPublicApi) {
      const userStore = useUserStore()
      if (userStore.token) {
        config.headers.Authorization = `Bearer ${userStore.token}`
        console.log('添加Authorization头:', config.url)

        // 添加用户ID和用户名请求头
        if (userStore.userInfo) {
          // 优先使用id，如果没有则使用userId
          const userId = userStore.userInfo.id || userStore.userInfo.userId
          if (userId) {
            config.headers['X-User-Id'] = userId
          }
          config.headers['X-User-Name'] = userStore.userInfo.username || userStore.userInfo.name || 'User'
          console.log('添加用户信息头:', config.url, 'ID:', userId, 'Name:', config.headers['X-User-Name'])
        } else {
          console.warn('用户信息不存在，请求可能被拒绝:', config.url)
        }
      } else {
        console.warn('未找到token，请求可能被拒绝:', config.url)
      }
    } else {
      console.log('公开API，不添加Authorization头:', config.url)
    }

    return config
  },
  error => {
    console.error('请求配置错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器 - 处理错误和统一格式
api.interceptors.response.use(
  response => {
    console.log('API响应成功:', response.config.url, response.status, response.data)
    
    // 如果响应是200，但是返回的是HTML页面（可能是登录页面重定向）
    if (response.status === 200 && response.headers['content-type'] && response.headers['content-type'].includes('text/html')) {
      console.error('API返回HTML页面，可能是未登录重定向:', response.config.url)
      // 如果是登录页面重定向，这里可以处理登出逻辑
      const userStore = useUserStore()
      if (userStore.token) {
        userStore.logout()
        router.push('/login')
      }
      return Promise.reject(new Error('会话已过期，请重新登录'))
    }
    
    // 统一处理响应数据格式
    // 检查是否是包装格式 {code: 200, data: ...}
    if (response.data && response.data.code === 200) {
      return response.data.data
    } else if (response.data && response.data.code && response.data.code !== 200) {
      // 处理业务错误
      const errorMessage = response.data.message || '请求失败'
      return Promise.reject(new Error(errorMessage))
    } else {
      // 处理直接返回数据的情况（后端未包装）
      return response.data
    }
  },
  error => {
    console.error('API响应错误:', error.config?.url, error.response?.status, error.response?.data)
    
    // 处理HTTP错误
    let errorMessage = '网络错误'
    if (error.response) {
      const { status } = error.response
      
      switch (status) {
        case 401:
          console.error('未授权，可能是token过期')
          // 检查是否是公开API
          const publicApis = ['/api/categories', '/api/products', '/api/products/hot']
          const isPublicApi = publicApis.some(api => error.config.url.includes(api))
          
          if (!isPublicApi) {
            errorMessage = '未授权，请登录'
            // 不自动登出和重定向，而是让用户决定
            // const userStore = useUserStore()
            // userStore.logout()
            // router.push('/login')
          } else {
            errorMessage = '获取数据失败，请稍后再试'
          }
          break
        case 403:
          console.error('禁止访问')
          // 检查是否是认证相关API
          const authApis = ['/api/auth/login', '/api/auth/register', '/api/auth/refresh-token']
          const isAuthApi = authApis.some(api => error.config.url.includes(api))
          
          if (isAuthApi) {
            errorMessage = '认证服务暂时不可用，请稍后再试'
          } else {
            errorMessage = '无权限访问'
          }
          break
        case 404:
          console.error('资源不存在')
          errorMessage = '请求的资源不存在'
          break
        case 500:
          console.error('服务器错误')
          errorMessage = '服务器内部错误'
          break
        default:
          console.error('其他错误:', status)
          errorMessage = error.response.data?.message || '请求失败'
      }
    } else if (error.request) {
      console.error('请求未到达服务器:', error.request)
      errorMessage = '网络错误，请检查网络连接'
    } else {
      console.error('请求配置错误:', error.message)
      errorMessage = '请求配置错误'
    }
    
    // 添加HTTP状态码到错误对象，以便调用者可以处理特定状态码
    error.customMessage = errorMessage
    error.statusCode = error.response?.status
    
    return Promise.reject(error)
  }
)

export default api